import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { LotteryConfig, LotteryItem } from './lottery-config.entity';

@Injectable()
export class LotteryService {
  constructor(
    @InjectRepository(LotteryConfig)
    private readonly lotteryRepo: Repository<LotteryConfig>,
  ) { }

  /**
   * 创建抽奖配置（初始化）
   * @param config 包含奖项列表和时长的配置
   */
  // async create(config: Partial<LotteryConfig>): Promise<LotteryConfig> {
  //   // 初始化时如果没有传items，默认空数组
  //   const newConfig = this.lotteryRepo.create({
  //     items: [],
  //     ...config,
  //   });
  //   return this.lotteryRepo.save(newConfig);
  // }

  /**
* 创建抽奖配置（初始化）
* 自动为初始奖项生成唯一ID，覆盖前端可能传入的id
*/
  async create(config: Partial<LotteryConfig>): Promise<LotteryConfig> {
    let processedItems: LotteryItem[] = [];
    if (config.items && config.items.length > 0) {
      // 关键修正：通过展开运算符覆盖前端传入的id，只定义一次id
      processedItems = config.items.map((item, index) => ({
        ...item, // 展开前端传入的字段（可能包含id）
        id: index + 1, // 强制生成新id，覆盖前端传入的id
      }));
    }

    const newConfig = this.lotteryRepo.create({
      items: processedItems,
      isShow: config.isShow ?? true,
      bgImage: config.bgImage,
      otherImage: config.otherImage,
      drawDuration: config.drawDuration ?? 3,
    });

    return this.lotteryRepo.save(newConfig);
  }

  /**
   * 获取所有抽奖配置
   */
  async findAll(): Promise<LotteryConfig[]> {
    return this.lotteryRepo.find({
      order: { updatedAt: 'DESC' }, // 按更新时间倒序
    });
  }

  /**
   * 获取单个抽奖配置
   * @param id 配置ID
   */
  async findOne(id: number): Promise<LotteryConfig> {
    const config = await this.lotteryRepo.findOneBy({ id });
    if (!config) {
      throw new NotFoundException(`抽奖配置 ID: ${id} 不存在`);
    }
    return config;
  }

  /**
   * 整体更新抽奖配置（支持批量更新奖项和时长）
   * @param id 配置ID
   * @param updateData 要更新的字段
   */
  async update(
    id: number,
    updateData: Partial<LotteryConfig>,
  ): Promise<LotteryConfig> {
    // 先查询是否存在
    await this.findOne(id);
    // 执行更新
    await this.lotteryRepo.update(id, updateData);
    // 返回更新后的数据
    return this.findOne(id);
  }

  /**
   * 单独更新抽奖时长
   * @param id 配置ID
   * @param drawDuration 新的时长（秒）
   */
  async updateDuration(
    id: number,
    drawDuration: number,
  ): Promise<LotteryConfig> {
    if (drawDuration <= 0) {
      throw new BadRequestException('抽奖时长必须为正数');
    }
    return this.update(id, { drawDuration });
  }

  /**
  * 新增：控制配置显示/隐藏
  * @param id 配置ID
  * @param isShow 是否显示（true/false）
  */
  async updateIsShow(id: number, isShow: boolean): Promise<LotteryConfig> {
    return this.update(id, { isShow });
  }

  /**
   * 新增：单独更新背景图
   * @param id 配置ID
   * @param bgImage 背景图URL
   */
  async updateBgImage(id: number, bgImage: string): Promise<LotteryConfig> {
    if (!bgImage) {
      throw new BadRequestException('背景图地址不能为空');
    }
    return this.update(id, { bgImage });
  }

  /**
   * 新增：单独更新其他图片
   * @param id 配置ID
   * @param otherImage 其他图片URL
   */
  async updateOtherImage(id: number, otherImage: string): Promise<LotteryConfig> {
    if (!otherImage) {
      throw new BadRequestException('其他图片地址不能为空');
    }
    return this.update(id, { otherImage });
  }

  /**
   * 单条添加奖项
   * @param configId 配置ID
   * @param newItem 新奖项
   */
  // async addSingleItem(
  //   configId: number,
  //   newItem: LotteryItem,
  // ): Promise<LotteryConfig> {
  //   const config = await this.findOne(configId);

  //   // 检查奖项ID是否重复
  //   const isDuplicate = config.items.some(item => item.id === newItem.id);
  //   if (isDuplicate) {
  //     throw new BadRequestException(`奖项 ID: ${newItem.id} 已存在`);
  //   }

  //   // 追加新奖项
  //   config.items.push(newItem);
  //   return this.lotteryRepo.save(config);
  // }
  /**
   * 单条添加奖项（自动生成ID）
   * @param configId 配置ID
   * @param newItem 新奖项（无需传入id，自动生成）
   */
  async addSingleItem(
    configId: number,
    newItem: Omit<LotteryItem, 'id'>, // 前端无需传id
  ): Promise<LotteryConfig> {
    const config = await this.findOne(configId);

    // 生成唯一ID：取现有最大ID + 1（确保递增且不重复）
    const maxId = config.items.length > 0
      ? Math.max(...config.items.map(item => item.id))
      : 0;
    const autoGeneratedId = maxId + 1;

    // 组装新奖项（自动添加ID）
    const itemWithId: LotteryItem = {
      id: autoGeneratedId,
      ...newItem,
    };

    // 追加到列表
    config.items.push(itemWithId);
    return this.lotteryRepo.save(config);
  }


  /**
   * 单条更新奖项
   * @param configId 配置ID
   * @param itemId 奖项ID
   * @param updateData 要更新的奖项字段
   */
  async updateSingleItem(
    configId: number,
    itemId: number,
    updateData: Partial<LotteryItem>,
  ): Promise<LotteryConfig> {
    const config = await this.findOne(configId);

    // 查找奖项索引
    const itemIndex = config.items.findIndex(item => item.id === itemId);
    if (itemIndex === -1) {
      throw new NotFoundException(`奖项 ID: ${itemId} 不存在`);
    }

    // 合并更新（保留原有字段，覆盖传入的字段）
    config.items[itemIndex] = { ...config.items[itemIndex], ...updateData };
    return this.lotteryRepo.save(config);
  }

  /**
   * 单条删除奖项
   * @param configId 配置ID
   * @param itemId 奖项ID
   */
  async deleteSingleItem(
    configId: number,
    itemId: number,
  ): Promise<LotteryConfig> {
    const config = await this.findOne(configId);

    // 过滤掉要删除的奖项
    const originalLength = config.items.length;
    config.items = config.items.filter(item => item.id !== itemId);

    // 如果长度没变，说明没找到要删除的奖项
    if (config.items.length === originalLength) {
      throw new NotFoundException(`奖项 ID: ${itemId} 不存在`);
    }

    return this.lotteryRepo.save(config);
  }

  /**
   * 删除整个抽奖配置
   * @param id 配置ID
   */
  async remove(id: number): Promise<void> {
    // 先查询是否存在
    await this.findOne(id);
    // 执行删除
    await this.lotteryRepo.delete(id);
  }
}